package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * compare 比较
 *
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(9,8));
        list.add(new Point(3,8));
        list.add(new Point(7,4));
        list.add(new Point(5,10));
        list.add(new Point(9,23));
        System.out.println(list);
        /*
            该sort方法要求集合元素必须实现接口:Comparable
            如果这个方法不能直接用,就不建议使用了,因为它会对我们的代码产生侵入性
            侵入性:
                当我们调用某个API时,其要求我们为其修改其他额外的代码这就是侵入性.
                侵入性不利于系统后期的维护,尽量避免.
         */
//        Collections.sort(list);
        /*
            重载的sort方法,要求我们再传入一个参数:Comparator比较器,来单独提供比较规则

         */
//        Comparator<Point> c = new Comparator<Point>() {
//            /*
//                该方法的作用是定义两个Point元素之间大小关系的评判标准
//                方法返回值表示大小关系,规定:
//                当返回值>0时,表达的是o1比o2大
//                当返回值<0时,表达的是o1比o2小
//                当返回值=0时,表达的是o1与o2相等
//             */
//            public int compare(Point o1, Point o2) {
//                //制定的规则:点到原点的距离谁长谁大
//                int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return olen1-olen2;
//            }
//        };
//        //将比较器传入后,sort方法会将元素两两传入比较器的compare方法比较后排序
//        Collections.sort(list,c);


//        Collections.sort(list, new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {
//                return o1.getX()*o1.getX()+o1.getY()*o1.getY()-o2.getX()*o2.getX()-o2.getY()*o2.getY();
//            }
//        });

        Collections.sort(
                list,
                (o1,o2)->o1.getX()*o1.getX()+o1.getY()*o1.getY()
                        -o2.getX()*o2.getX()-o2.getY()*o2.getY()

        );

        System.out.println(list);
    }
}






